/*
 * RLEEncoder.cpp
 *
 *  Created on: 13/12/2012
 *      Author: guidi
 */

#include "rle-encoder.h"
#include "compresor.h"
#include "descompresor.h"
#include "contenedor-nombre-archivo.h"
#include "const.cpp"

RLEencoder::RLEencoder() {
	entrada = new std::ifstream;
	salida = new std::ofstream;
}

RLEencoder::~RLEencoder() {
	entrada->close(); delete entrada;
	salida->close(); delete salida;
}

int RLEencoder::comprimir(std::string rutaEntrada, std::string rutaSalida) {
	int resultado = abrirArchivos(rutaEntrada, rutaSalida, COMPRIMIR);
	if (resultado == CODIGO_OK) {
	Compresor compresor;
	resultado = compresor.comprimir(entrada, salida);
		std::cout << "Archivo " << rutaEntrada << " comprimido a " << rutaSalida
			<< std::endl;
	}
	else {
		std::cout << "No se pudo comprimir correctamente, error numero " <<
				resultado << std::endl;
	}
	return resultado;
}

int RLEencoder::descomprimir(std::string rutaEntrada, std::string rutaSalida) {
	int resultado = abrirArchivos(rutaEntrada, rutaSalida, DESCOMPRIMIR);
	if (resultado == CODIGO_OK) {
	Descompresor descompresor;
	resultado = descompresor.descomprimir(entrada, salida);
		std::cout << "Archivo " << rutaEntrada << " descomprimido a " << rutaSalida
			<< std::endl;
	}
	else {
		std::cout << "No se pudo descomprimir correctamente, error numero " <<
				resultado << std::endl;
	}
	return resultado;
}

int RLEencoder::abrirArchivos(std::string rutaEntrada, std::string rutaSalida,
		MODO modo) {
	this->entrada->open(rutaEntrada.c_str());
	std::string chequeoExtension = (modo == COMPRIMIR) ? rutaSalida : rutaEntrada;
	ContenedorNombreArchivo contenedor(chequeoExtension);
	if (!contenedor.tieneExtension(EXTENSION)) {
		std::cout << "Por favor, seleccion un archivo " << EXTENSION
				<< std::endl;
		return ERROR_EXTENSION_INCORRECTA;
	} else if (!entrada->is_open()) {
		std::cout
				<< "El archivo " + rutaEntrada
						+ " no existe, no se puede comprimir" << std::endl;
		return ERROR_RUTA_INCORRECTA;
	} else if (Utils::is_empty (*entrada)) {
		std::cout << "El archivo esta vacio, no se puede descomprimir"
				<< std::endl;
		return ERROR_ARCHIVO_VACIO;
	} else if (rutaEntrada.compare(rutaSalida) == 0) {
		std::cout << "El archivo de entrada y de salida son los mismos"
				<< std::endl;
		return ERROR_ARCHIVOS_IGUALES;
	} else {
		this->salida->open(rutaSalida.c_str(), std::ios::trunc);
	}
	return CODIGO_OK;
}
